perm filename P3JSB.DAT[MM,LCS] blob
sn#166796 filedate 1975-07-02 generic text, type T, neo UTF8
TE TAB
JRST EDGL2 ;AND GET MORE
EDITIT: FOR X IN(D,A,EDCNM){PUSH P,X↔} ;COMMAND WANTS EDIT DONE - DO IT AND DISPATCH
PUSHJ P,REPLIN
POP P,EDCNM
POP P,A
POPJ P,
REPLIN: SKIPGE EDCHR ;HERE WE REPLACE THE CURRENT LINE TEXT WITH THE EDITED VERSION
SOS EDSIZ ;FUDGE FOR LF (IF PRESENT)
SOS T,EDSIZ ;AS WELL AS FOR ACTIVATION CHAR
MOVEM T,EDCNM ;A RANDOM PLACE TO SAVE IT
MOVE T,EDTTBS
LSH T,1
ADD T,EDCOLS ;# COLS + 2 * # TABS = TOTAL # CHARS WITH EXPANDED TABS
PUTBAK: TLO F,NULLIN
PUSHJ P,EDPUT ;COPY THE TEXT (SHUFFLES ASSUMING C(T) CHARS)
SKIPN EDCNM
JRST [ MOVEI C,40 ;EMPTY LINE - PUT IN A SPACE FOR DD
IDPB C,A
JRST .+1]
FOR X IN(15,12) ;TERMINATE IT
{ MOVEI C,X
IDPB C,A
} TDZA C,C
IDPB C,A
TLNE A,760000
JRST .-2 ;FLUSH ANY GARBAGE IN THE REST OF THE WORD
MOVE T,EDCNM ;# CHARS
ADDI T,2 ;ACCOUNT FOR CRLF
DPB T,[111100,,TT] ;COMBINE WITH # COLS (FROM EDPUT)
LDB C,[111100,,1(D)] ;OLD # CHARS
SUB T,C
ADDM T,CHARS ;UPDATE COUNT BY DIFFERENCE
HRRM TT,1(D)
JRST SETWRT
;EDPUT, EDPLR
;EDPUT ADJUSTS BUFFER TO TAKE C(T)+3 (CR-LF-NUL) CHARS INSTEAD OF THE CURRENT LINE,
;THEN COPIES C(EDCNM) CHARS FROM BUF, EXPANDING TABS
EDPUT: ADDI T,4+2+5*LLDESC ;<ROUND UP>+<CR-LF>+<EXTRA WDS>
IDIVI T,5 ;# WDS
TLNE F,OFFEND+PMLIN
JRST EDPLUZ ;OOPS - IT'S A PHONY LINE
EDPLR: MOVE A,ARRLIN
HRRZ B,-1(A) ;OLD # WDS
CAIN T,-2(B)
JRST EDPS
CAIL T,-2(B)
TLO F,NOCHK
MOVE B,T
PUSH P,1(A)
MOVE T,(A)
PUSH P,T
HRLM P,(T)
MOVS T,T
HRRM P,(T)
PUSHJ P,FSGIVE
TLZ F,NOCHK
PUSHJ P,FSGET
MOVSI T,TXTCOD
HLLM T,-1(A)
MOVEM A,ARRLIN
POP P,T
MOVEM T,(A)
HRLM A,(T)
MOVS T,T
HRRM A,(T)
POP P,T
MOVEM T,1(A)
TLNE T,WINBIT
MOVEM A,WINLIN
SETOM LLDESC(A)
CAIG B,LLDESC+1
JRST EDPS
MOVSI T,LLDESC(A)
HRRI T,LLDESC+1(A)
ADDI B,(A)
BLT T,-1(B)
;FALLS THRU
;EDPS, EDPL, EDPLUZ
EDPS: AOS T,TXTNUM
MOVEM T,2(A)
MOVEI D,(A)
ADD A,[440700,,LLDESC]
MOVE B,[440700,,BUF]
MOVEI TT,
SKIPN T,EDCNM
POPJ P,
TLZ F,NULLIN
EDPL: ILDB C,B
IDPB C,A
CAIE C,11 ;THE ONLY THING WE WORRY ABOUT
AOJA TT,[ SOJG T,EDPL
POPJ P,]
MOVEI C,40 ;TAB - APPEND SOME SPACES
HRLS TT
TLO TT,-10
IDPB C,A
AOBJN TT,.-1
MOVEI C,11
IDPB C,A
SOJG T,EDPL
POPJ P,
EDPLUZ: PUSH P,T ;HERE AFTER EDITING LINE N+1 (PHONY NULL LINE MADE AT EDNUL)
PUSHJ P,INSONA ;MAKE A REAL LINE
POP P,T ;RESTORE # WORDS
JRST EDPLR
;EDSNK, EDSNK2, EDSNK3, ESDSP, ESALT
EDSNK: TRO F,EDITM
PUSHJ P,DISP
XCT LINTST
TRO F,DSPSCR
MOVEI DSP,ESDSP-2
PUSHJ P,LINS1
JRST EDSNK2
INCHRW T
LSH T,-7
DPB T,[70200,,C]
EDSNK2: MOVEM C,COMCHR
TLNN F,OFFEND+PMLIN
JRST EDSNK3
PUSH P,B
PUSH P,D
PUSH P,TT
PUSHJ P,INSONA
POP P,TT
POP P,D
POP P,B
EDSNK3: PUSHJ P,LINSTO
MOVE C,COMCHR
ANDI C,577
CAIE C,415
POPJ P,
MOVEI A,1
JRST MOVARR
ESDSP: JRST POPJ1
POPJ P,
JRST LINTAB
JRST LINGLP
JRST ESALT
ESALT: SUB P,[1,,1]
MOVE A,ARRLIN
AOS T,TXTNUM
HRRM T,2(A)
POPJ P,
;CRDSP, REGCR, REGCR1, REGCR2
;FOR CR WE DISPATCH ON CONTROL BITS
CRDSP: NOEDIT!SACMD!SSCMD,,REGCR
DOEDIT!SSCMD,,CONTCR
NOEDIT!NOATT,,METACR
NOEDIT!NOATT,,DUBLCR
TLO F,OKF
REGCR: TRNN F,EDITM ;REG CR - IF EDITING
JRST REGCR1
PUSHJ P,LECR ;TAKE APPROPRIATE ACTION
JRST REGCR2 ;NO - JUST MOVE
PUSH P,D
PUSHJ P,REPRST
POP P,D
PUSH P,[1]
PUSH P,[311] ;SET UP INSERT MODE FOR NEW LINE
JRST EDTMOR
REGCR1: AOS (P)
REGCR2: TRNE F,ATTMOD
JRST MOVARR
MOVE B,ARRL ;HERE WE'RE JUST MOVING - SEE WHERE TO
CAMLE B,LINES
JUMPG A,INSONE ;GOING OFF THE BOTTOM - ADD A LINE
JRST MOVARR ;OK - JUST MOVE IT
;CONTCR, CNTCR2, METACR, REPRST, REPRS2
PUSHJ P,CNTCR2
CONTCR: TRNE F,EDITM
POPJ P,
SKIPN A,SRCOFF
JRST POPJ1
HRRZM A,EDMOV
MOVEI A,
JRST EDIT
CNTCR2: MOVE D,[EDOK*10,,EDIT]
MOVEI A,
POPJ P,
METACR: TRNE F,EDITM
PUSHJ P,LECR ;DO LINE EDIT STUFF IF NECESSARY
JRST INSONE ;NOT MIDDLE OF LINE - JUST ADD BLANK LINE
REPRST: MOVN T,EDCNM ;HERE WE STORE THE REST OF THE LINE AFTER THE ACTIVATOR
ADDM T,EDSIZ ;BY UPDATING ALL THE PARAMS BY THE AMOUNT ALREADY DONE
AOSG T,EDTABP
JRST REPRS2
SOS TT,T ;HERE WE FUDGE FOR THE TAB WHOSE POSITION
SUB TT,EDPOS ;(AND HENCE SIZE) IS CHANGING (SIGH)
ORCMI T,7
ORCMI TT,7
SUB T,TT
REPRS2: SUB T,EDPOS
ADDM T,EDCOLS
MOVN T,EDTBS
ADDM T,EDTTBS
JRST REPLIN
;LECR, DUBLCR, DUBCR2
;HERE WE HANDLE ALL FLAVORS OF CR FROM THE LINE EDITOR
;IF IT'S AT THE END WE JUST REPLACE THE TEXT AND RETURN
;IF IT'S IN THE MIDDLE WE REPLACE UP TO THE BREAK, MAKE A NEW LINE,
;MOVE THE REMAINING TEXT DOWN IN BUF, AND SKIP RETURN
LECR: TRNN F,EDBRK ;MIDDLE OF LINE?
JRST [ PUSH P,A
PUSHJ P,REPLIN ;NO - REPLACE WHOLE LINE
POP P,A
POPJ P,] ;& RETURN
AOS (P) ;TELL CALLER WE'RE SPLITTING A LINE
MOVE T,EDTBS
LSH T,1 ;2 TABS/TAB
ADD T,EDPOS
PUSH P,C
PUSHJ P,PUTBAK ;PUT FIRST PART BACK
PUSH P,B
MOVEI A,1
PUSHJ P,MOVARR ;TO THE NEXT LINE
PUSHJ P,INSONA ;AND MAKE A NEW ONE
POP P,B
MOVE D,[440700,,BUF]
ILDB C,B ;COPY REST OF TEXT DOWN WHERE REPLACER EXPECTS IT
IDPB C,D
JUMPN C,.-2
POP P,C
POPJ P,
DUBLCR: TRNN F,EDITM
JRST DUBCR1
PUSHJ P,LECR
JRST DUBCR3
TRZ F,EDITM+EDBRK
PUSH P,A
PUSHJ P,REPRST ;PUT THE REST BACK
POP P,A
DUBCR1: TRNN F,ARG
JRST LININS ;NO ARG -ENTER LINE INSERT MODE
DUBCR2: MOVNS A ;INVERT SENSE OF ARROW MOVING
JRST INSNUL ;ARG GIVEN - INSERT N BLANK LINES
DUBCR3: TRNE F,ARG
JRST DUBCR2
MOVEI A,1
PUSHJ P,MOVARR
JRST LININS
;INSONA, INSONE, INSNUL, INSNLP
;INSNUL INSERTS |C(A)| NULL LINES BEFORE (+) OR AFTER (-) THE ARROW
INSONA: SKIPA A,[-1]
INSONE: MOVEI A,1
INSNUL: MOVM D,A ;# TO INSERT
JUMPE D,CPOPJ
PUSH P,A
ADDM D,LINES
SKIPG XXLINE ;Are there marks on this page
JRST .+4
PUSH P,D
PUSHJ P,XLALL ;Fix up marks
POP P,D
PUSHJ P,LINSET ;# LINES HAS CHANGED
MOVEI B,(D)
LSH B,1
ADDM B,CHARS
MOVSI T,WINBIT
SKIPE A,WINLIN
ANDCAM T,1(A)
SETZM WINLIN
MOVEI B,LLDESC+1
MOVSI C,TXTCOD
MOVSI E,ARRBIT
MOVE G,[ARRBIT,,2000]
MOVE H,[ASCID/
/]
INSNLP: PUSHJ P,FSGET
HLLM C,-1(A)
MOVE T,ARRLIN
HLL T,(T)
MOVEM T,(A)
HRLM A,(T)
ANDCAM E,1(T)
MOVS T,T
HRRM A,(T)
MOVEM A,ARRLIN
MOVEM G,1(A)
AOS T,TXTNUM
MOVEM T,2(A)
MOVEM H,LLDESC(A)
SOJG D,INSNLP
PUSHJ P,SETWRT
MOVE A,TOPWIN
SKIPL (P)
ADD A,(P) ;MOVE WINDOW INSTEAD OF ARROW
PUSHJ P,SETWIN ;RECOMPUTE
POP P,A ;ORIGINAL ARG
JUMPGE A,MOVARR
TLO F,NULLIN
TLZ F,PMLIN
POPJ P,
;LININS, LINSLP, LINS1, LINGLP, LIDSP, LINTAB
LININS: MOVEI T,"↔"
DPB T,[10700,,ARRON]
MOVEM F,FSAV#
TLZ F,TF1
LINSLP: PUSHJ P,INSONA
TRO F,EDITM
PUSHJ P,DISP
XCT LINTST
MOVEI DSP,LIDSP-2
PUSHJ P,LINS1
JRST LINCOM
JRST LINSLP
POPJ P,
LINS1: MOVSI E,LSPC
SETZB B,TT
SETOM BUF
MOVE T,[BUF,,BUF+1]
BLT T,BUF+37
MOVE D,[440700,,BUF]
LINGLP: INCHWL C
TRNE C,600
POPJ P,
TDNE E,CTAB(C)
XCT @CTAB(C)
IDPB C,D
AOJA B,LINGLP
LIDSP: JRST LINCR1
POPJ P,
JRST LINTAB
JRST LINGLP
JRST LINALT
LINTAB: IDPB C,D
SUB TT,B
HRLS B
TLO B,-10
MOVEI T,40
IDPB T,D
AOBJN B,.-1
IDPB C,D
ADDI TT,1(B)
JRST LINGLP